/**
 * J<i>ava</i> U<i>tilities</i> for S<i>tudents</i>
 */
package jus.aor.mobilagent.route;

import java.io.Serializable;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.NoSuchElementException;
import jus.aor.mobilagent.kernel.AgentServerInterface;

/**
 * Définit la feuille de route que l'agent va suivre
 *
 * @author Morat
 */
public class Route implements Iterable<Etape>, Serializable {

    private static final long serialVersionUID = 9081294824590167316L;

    /**
     * la liste des étapes à parcourir autres que la dernière
     */
    protected List<Etape> route = new LinkedList<>();
    /**
     * la dernière étape de la feuille de route de l'agent qui désigne le
     * serveur de départ.
     */
    protected Etape retour;
    /**
     * Indique si la feuille de route est épuisée ou non.
     */
    protected boolean hasNext;

    /**
     * Construction d'une route.
     *
     * @param retour le server initial et de retour.
     */
    public Route(Etape initialise, Etape retour) {
        this.retour = retour;
        route.add(initialise);
        hasNext = true;
    }

    /**
     * Ajoute une étape en fin de route.
     *
     * @param e l'étape à ajouter
     */
    public void addEtape(Etape e) {
        route.add(e);
    }

    /**
     * Restitue la prochaine étape ou la dernière qui est la base de départ.
     *
     * @return la prochaine étape.
     */
    public Etape get() throws NoSuchElementException {
        if (route.isEmpty()) {
            if (hasNext) {
                return retour;
            } else {
                throw new NoSuchElementException();
            }
        } else {
            return route.get(0);
        }
    }

    /**
     * Restitue la prochaine étape et élimine de la route ou la dernière qui est
     * la base de départ.
     *
     * @return la prochaine étape.
     */
    public Etape next() throws NoSuchElementException {
        Etape e = get();
        if (route.isEmpty()) {
            //Si la route est vide, on a retourné l'etape de fin, il n'y a donc plus rien
            hasNext = false;
        } else {
            //si la liste n'est pas vide, on suppr le premier element
            route.remove(0);
        }

        return e;
    }

    /**
     * Il y a-t-il encore une étape à parcourir.
     *
     * @return vrai si une étape est possible.
     */
    public boolean hasNext() {
        return hasNext;
    }

    /* (non-Javadoc)
     * @see java.lang.Iterable#iterator()
     */
    @Override
    public Iterator<Etape> iterator() {
        return route.iterator();
    }
    /* (non-Javadoc)
     * @see java.lang.Object#toString()
     */

    @Override
    public String toString() {
        return route.toString().replaceAll(", ", "->");
    }
}
